from contextlib import contextmanager
import time

from rich.console import Console
from rich.table import Table
from rich.measure import Measurement
from rich import box
from rich.text import Text

TABLE_DATA = [
    [
        "May 25, 1977",
        "Star Wars Ep. [b]IV[/]: [i]A New Hope",
        "$11,000,000",
        "$1,554,475",
        "$775,398,007",
    ],
    [
        "May 21, 1980",
        "Star Wars Ep. [b]V[/]: [i]The Empire Strikes Back",
        "$23,000,000",
        "$4,910,483",
        "$547,969,004",
    ],
    [
        "May 25, 1983",
        "Star Wars Ep. [b]VI[/b]: [i]Return of the Jedi",
        "$32,500,000",
        "$23,019,618",
        "$475,106,177",
    ],
    [
        "May 19, 1999",
        "Star Wars Ep. [b]I[/b]: [i]The phantom Menace",
        "$115,000,000",
        "$64,810,870",
        "$1,027,044,677",
    ],
    [
        "May 16, 2002",
        "Star Wars Ep. [b]II[/b]: [i]Attack of the Clones",
        "$115,000,000",
        "$80,027,814",
        "$656,695,615",
    ],
    [
        "May 19, 2005",
        "Star Wars Ep. [b]III[/b]: [i]Revenge of the Sith",
        "$115,500,000",
        "$380,270,577",
        "$848,998,877",
    ],
]

console = Console()

BEAT_TIME = 0.04


@contextmanager
def beat(length: int = 1) -> None:
    with console:
        console.clear()
        yield
    time.sleep(length * BEAT_TIME)


table = Table(show_footer=False)


console.clear()
console.show_cursor(False)
try:

    table.add_column("Release Date", no_wrap=True)
    with beat(10):
        console.print(table, justify="center")

    table.add_column("Title", Text.from_markup("[b]Total", justify="right"))
    with beat(10):
        console.print(table, justify="center")

    table.add_column("Budget", "[u]$412,000,000", no_wrap=True)
    with beat(10):
        console.print(table, justify="center")

    table.add_column("Opening Weekend", "[u]$577,703,455", no_wrap=True)
    with beat(10):
        console.print(table, justify="center")

    table.add_column("Box Office", "[u]$4,331,212,357", no_wrap=True)
    with beat(10):
        console.print(table, justify="center")

    table.title = "Star Wars Box Office"
    with beat(10):
        console.print(table, justify="center")

    table.title = (
        "[not italic]:popcorn:[/] Star Wars Box Office [not italic]:popcorn:[/]"
    )
    with beat(10):
        console.print(table, justify="center")

    table.caption = "Made with Rich"
    with beat(10):
        console.print(table, justify="center")

    table.caption = "Made with [b]Rich[/b]"
    with beat(10):
        console.print(table, justify="center")

    table.caption = "Made with [b magenta not dim]Rich[/]"
    with beat(10):
        console.print(table, justify="center")

    for row in TABLE_DATA:
        table.add_row(*row)
        with beat(10):
            console.print(table, justify="center")

    table.show_footer = True
    with beat(10):
        console.print(table, justify="center")

    table_width = Measurement.get(console, table, console.width).maximum

    table.columns[2].justify = "right"
    with beat(10):
        console.print(table, justify="center")

    table.columns[3].justify = "right"
    with beat(10):
        console.print(table, justify="center")

    table.columns[4].justify = "right"
    with beat(10):
        console.print(table, justify="center")

    table.columns[2].header_style = "bold red"
    with beat(10):
        console.print(table, justify="center")

    table.columns[3].header_style = "bold green"
    with beat(10):
        console.print(table, justify="center")

    table.columns[4].header_style = "bold blue"
    with beat(10):
        console.print(table, justify="center")

    table.columns[2].style = "red"
    with beat(10):
        console.print(table, justify="center")

    table.columns[3].style = "green"
    with beat(10):
        console.print(table, justify="center")

    table.columns[4].style = "blue"
    with beat(10):
        console.print(table, justify="center")

    table.columns[0].style = "cyan"
    table.columns[0].header_style = "bold cyan"
    with beat(10):
        console.print(table, justify="center")

    table.columns[1].style = "magenta"
    table.columns[1].header_style = "bold magenta"
    with beat(10):
        console.print(table, justify="center")

    table.columns[2].footer_style = "bright_red"
    with beat(10):
        console.print(table, justify="center")

    table.columns[3].footer_style = "bright_green"
    with beat(10):
        console.print(table, justify="center")

    table.columns[4].footer_style = "bright_blue"
    with beat(10):
        console.print(table, justify="center")

    table.row_styles = ["none", "dim"]
    with beat(10):
        console.print(table, justify="center")

    table.border_style = "bright_yellow"
    with beat(10):
        console.print(table, justify="center")

    for box in [
        box.SQUARE,
        box.MINIMAL,
        box.SIMPLE,
        box.SIMPLE_HEAD,
    ]:
        table.box = box
        with beat(10):
            console.print(table, justify="center")

    table.pad_edge = False
    with beat(10):
        console.print(table, justify="center")

    original_width = Measurement.get(console, table).maximum

    for width in range(original_width, console.width, 2):
        table.width = width
        with beat(2):
            console.print(table, justify="center")

    for width in range(console.width, original_width, -2):
        table.width = width
        with beat(2):
            console.print(table, justify="center")

    for width in range(original_width, 90, -2):
        table.width = width
        with beat(2):
            console.print(table, justify="center")

    for width in range(90, original_width + 1, 2):
        table.width = width
        with beat(2):
            console.print(table, justify="center")

    table.width = None
    with beat(2):
        console.print(table, justify="center")

finally:
    console.show_cursor(True)
